const { NON_EDITABLE } = require('./constants/index');

// 对象->字符串
  // obj -- 传入对象
  // space -- 前置空格数(默认2；2|6)
const objectToString = (obj = {}, space = 2) => {
  const keyArr = Object.keys(obj) || [];
  let text = ''; // 设置存储字符串

  // 对象为空
  if(!keyArr.length) return text;

  keyArr.forEach((key, index) => {
    // 获取实际值
    const value = obj[key];

    let _text;
    // 值是否加引号(Number, Boolean, key为'label'不需要加; String需要加)
    if( key === 'label' || ['number', 'boolean'].includes(typeof value)) {
      _text = `${key}: ${value},`;
    }else if(typeof value === 'string') {
      _text = `${key}: '${value}',`;
    }

    // 行前空格对齐
    if(space === 2) {
      // 空2格(DS基础属性)
      _text = `  ${_text}`;
    }else if(space === 6) {
      // 空6格(queryFields|fields属性)
      _text = `      ${_text}`;
    } 

    // 除最后一行外，其余行后需要加换行符
    if(index !== keyArr.length - 1) {
      _text = `${_text}\n`;
    }

    text = text + _text;
  });

  return text;

}

// 数组对象->字符串
const arrayToString = (arr = []) => {
  const array = [...arr];
  // 字符串存储
  let text = '';

  if(!array.length) return text;

  array.forEach((obj, index) => {
    // 获取对象处理初次数据
    let _text = objectToString(obj, 6);
    
    _text = `{\n${_text}\n    },`;
    if(index) {
      _text = `    ${_text}`;
    }
    
    // 最后一个对象后面不需要换行
    if(index !== array.length - 1) {
      _text = `${_text}\n`;
    }

    text = text + _text;
  });

  return text;
}

// 下划线转驼峰
const underlineToHump = (name) => {
  if(name) new Error('字段不能为空！');

  // 字段数组
  const arr = name.split('_') || [];

  // 第一个字段
  const first = arr[0];

  // 除第一个字段外其余字段
  const _arr = [...arr];
  _arr.shift();

  // 进行 后续字段首字母大写操作
  const _actArr = _arr.map(item => {
    // 获取首字母并大写
    const head = (item.slice(0, 1)).toUpperCase();
    // 获取除第一个字母外其它字母
    const other = item.slice(1);

    return head + other;
  });

  // 实际数据
  const actArr = [first, ..._actArr];

  return actArr.join('');
}

// 过滤(简单、单层)对象中值为null、undefined、''的属性
const filterEmptyProps = (obj = {}) => {
  const keyArr = Object.keys(obj);
  let object = {};

  if(!keyArr.length) return object;

  object = {...obj};
  keyArr.forEach(key =>  {
    // 值为null、undefined、''(需要排除值为0和false)
    if(object[key] !== 0 && object[key] !== false && !object[key]){
      // 删除空值属性
      delete object[key];
    }
  });

  return object;
}

// 生成特殊字体(默认黑背景、绿色)-(\033[42;30m  \033[背景色编号;字色编号m)
  // content: 打印文本
  // background: 背景色编号(默认黑色(40))
  // colour: 字体颜色(默认绿色(32))
  // special: 特殊配置符
    // Tips:
      // 字色编号：30黑，31红，32绿，33黄，34蓝，35紫，36深绿，37白色
      // 背景编号：40黑，41红，42绿，43黄，44蓝，45紫，46深绿，47白色
        // \033[0m 关闭所有属性    \033[1m 设置高亮度              \033[4m 下划线
        // \033[5m 闪烁           \033[7m 反显                    \033[8m 消隐
        // \033[nA 光标上移n行     \033[nB 光标下移n行             \033[nC 光标右移n列
        // \033[nD 光标左移n列     \033[y;xH 设置光标位置(y列x行) \033[2J 清屏
        // \033[K 清除从光标到行尾的内容
const createSpecialText = (content = '---', background = '40', colour = '32', special) => {
  // 设置属性
  let start = '\033[' + background + ';' + colour + 'm';

  // 设置特殊属性
  if(special) {
    start = '\033[' + background + ';' + special;
  }
  
  // 还原属性
  const end = '\033[0m';

  const text = start + ` ${content} ` + end;

  return text;
}

// 过滤表格输入(字符串)内容前后的空格
const stringTrim = (str) => {
  if(typeof str === 'string') {
    return str.trim();
  }else {
    return str;
  }
}

// 生成Form的Item
const createFormItemText = (text = '', type, name, edit) => {
  let formText = text;

  switch(type) {
    case 'string':
      formText = formText + `<TextField name="${name}"${edit === NON_EDITABLE ? ' disabled' : ''} />\n`;
      break;
    case 'number':
      formText = formText + `<NumberField name="${name}"${edit === NON_EDITABLE ? ' disabled' : ''} />\n`;
      break;
    case 'select':
      formText = formText + `<Select name="${name}"${edit === NON_EDITABLE ? ' disabled' : ''} />\n`;
      break;
    case 'dateTime':
      formText = formText + `<DateTimePicker name="${name}"${edit === NON_EDITABLE ? ' disabled' : ''} />\n`;
      break;
    default:
      break;
  }

  return formText;
}

module.exports = {
  objectToString,
  arrayToString,
  underlineToHump,
  filterEmptyProps,
  createSpecialText,
  stringTrim,
  createFormItemText,
};